package com.snack.shop.config;

import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAPublicKeyConfig;
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.refund.RefundService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;

import java.io.File;

/**
 * 微信支付配置类
 */
@Slf4j
@Data
@Configuration
@ConfigurationProperties(prefix = "wxpay")
public class WxPayConfig {

    /**
     * 小程序APPID
     */
    private String appId;

    /**
     * 商户号
     */
    private String mchId;

    /**
     * 商户API私钥路径（例如：classpath:wxpay/apiclient_key.pem）
     */
    private String privateKeyPath;

    /**
     * 商户API证书序列号
     */
    private String merchantSerialNumber;

    /**
     * 微信支付平台公钥路径
     */
    private String wechatPayPublicKeyPath;

    /**
     * 微信支付平台公钥ID
     */
    private String wechatPayPublicKeyId;

    /**
     * 商户APIv3密钥
     */
    private String apiV3Key;

    /**
     * 支付回调地址
     */
    private String notifyUrl;

    /**
     * 退款回调地址
     */
    private String refundNotifyUrl;

    /**
     * 创建微信支付配置对象
     */
    @Bean
    public Config config() {
        try {
            log.info("初始化微信支付配置：mchId={}, privateKeyPath={}, wechatPayPublicKeyPath={}", 
                    mchId, privateKeyPath, wechatPayPublicKeyPath);
            
            // 解析商户私钥文件路径
            File privateKeyFile = ResourceUtils.getFile(privateKeyPath);
            String privateKeyFilePath = privateKeyFile.getAbsolutePath();
            log.info("商户私钥文件路径：{}", privateKeyFilePath);
            
            // 解析微信支付平台公钥文件路径
            File wechatPayPublicKeyFile = ResourceUtils.getFile(wechatPayPublicKeyPath);
            String wechatPayPublicKeyFilePath = wechatPayPublicKeyFile.getAbsolutePath();
            log.info("微信支付平台公钥文件路径：{}", wechatPayPublicKeyFilePath);
            
            // 使用微信支付公钥的RSA配置（官方推荐方式）
            Config config = new RSAPublicKeyConfig.Builder()
                    .merchantId(mchId)
                    .privateKeyFromPath(privateKeyFilePath)
                    .publicKeyFromPath(wechatPayPublicKeyFilePath)
                    .publicKeyId(wechatPayPublicKeyId)
                    .merchantSerialNumber(merchantSerialNumber)
                    .apiV3Key(apiV3Key)
                    .build();
            
            log.info("微信支付配置初始化成功（使用公钥模式）");
            return config;
            
        } catch (Exception e) {
            log.error("初始化微信支付配置失败", e);
            log.error("请检查：");
            log.error("1. 商户私钥文件是否存在：{}", privateKeyPath);
            log.error("2. 微信支付平台公钥文件是否存在：{}", wechatPayPublicKeyPath);
            log.error("3. 公钥ID是否正确：{}", wechatPayPublicKeyId);
            throw new RuntimeException("微信支付配置初始化失败：" + e.getMessage(), e);
        }
    }

    /**
     * 创建JSAPI支付服务（包含小程序支付）
     */
    @Bean
    public JsapiServiceExtension jsapiService(Config config) {
        return new JsapiServiceExtension.Builder()
                .config(config)
                .build();
    }

    /**
     * 创建退款服务
     */
    @Bean
    public RefundService refundService(Config config) {
        return new RefundService.Builder()
                .config(config)
                .build();
    }
}

